/*
** $ 身份：嘞词汇.h $
** 词汇分析器
** 请参见 炉啊.h中的版权声明
*
* 本人所用声母表: a啊 b哔 c西 d迪 e鹅 f弗 g哥 
* h喝 i艾 j鸡 k颗 l嘞 m摸 n恩
* o欧 p匹 q气 r日 s丝 t嚏 
* u由 v微 w屋 x斯 y医 z只
*
* 一些英文单词缩写,我的翻译大多来自;有道词典,谷歌翻译,百度.
* 一些术语实在不好翻译,所以就原封不动.
* 
*/

#ifndef 嘞词汇_喝
#define 嘞词汇_喝

#include "嘞对象.h"
#include "嘞只入出.h"

#define 第一_保留	257


#if !defined(炉啊_环境)
#define 炉啊_环境		"_环境"
#endif

/*
*警告: 如果您更改此枚举的秩序，
* 搜索正则打印行 "秩序保留"
*/
enum 保留 {
  /* 保留字表示的终结符 */
  缩牌_与 = 第一_保留, 缩牌_断开,
  缩牌_做, 缩牌_否则, 缩牌_否若, 缩牌_终, 缩牌_假, 缩牌_为, 缩牌_函数,
  缩牌_去到, 缩牌_若, 缩牌_内, 缩牌_本地, 缩牌_无, 缩牌_非, 缩牌_或, 缩牌_重复,
  缩牌_返回, 缩牌_那么, 缩牌_真, 缩牌_直到, 缩牌_一会儿,
  /* 其他终结符 */
  缩牌_符号除, 缩牌_连接, 缩牌_点, 缩牌_等于, 缩牌_大等, 缩牌_小等, 缩牌_不等,
  缩牌_左移, 缩牌_右移,
  缩牌_双冒号, 缩牌_串终,
  缩牌_浮点, 缩牌_整型, 缩牌_名字, 缩牌_串
};

/* 号码保留字 */
#define 号码_保留	(投_整型(缩牌_一会儿-第一_保留 + 1))

typedef union {
  炉啊_号码 日;
  炉啊_整数 艾;
  嚏串 *嚏丝;
} 语义信息;  /* 语义信息 */

typedef struct 牌 {
  int 牌;
  语义信息 语义信息;
} 牌;

/* 当由所有函数共享时，词汇器的状态加上解析器的状态 */
typedef struct 词国 {
  int 当前;  /* 当前印刻 (印刻整型) */
  int 行号码;  /* 输入行计数器 */
  int 最后行;  /* 最后一行牌  '已消耗'  */
  牌 嚏;  /* 当前牌 */
  牌 看前面;  /* 看前面的牌 */
  struct 函数国 *函国;  /* 当前函数 (解析器) */
  struct 炉啊_国 *嘞;
  只入出 *只;  /* 输入流 */
  摸缓冲 *缓冲冲;  /* 缓冲为牌 */
  表 *喝;  /* 避免收集/重用串 */
  struct 动态数据 *迪医迪;  /* 解析器使用的动态结构 */
  嚏串 *源;  /* 当前源码名字 */
  嚏串 *环境名;  /* 环境变量名字 */
} 词国;

炉啊艾_函 void 炉啊斯_初始 (炉啊_国 *嘞);
炉啊艾_函 void 炉啊斯_设置输入 (炉啊_国 *嘞, 词国 *嘞丝, 只入出 *只,
                              嚏串 *源, int 第一印刻);
炉啊艾_函 嚏串 *炉啊斯_新串 (词国 *嘞丝, const char *串, size_t 嘞);
炉啊艾_函 void 炉啊斯_下一个 (词国 *嘞丝);
炉啊艾_函 int 炉啊斯_看前面 (词国 *嘞丝);
炉啊艾_函 嘞_不返 炉啊斯_句法错误 (词国 *嘞丝, const char *丝);
炉啊艾_函 const char *炉啊斯_牌到串 (词国 *嘞丝, int 牌);


#endif